
import java.awt.Color;
import java.awt.Graphics2D;
import java.util.ArrayList;

import javax.swing.JFrame;

import environnement.Environnement;
import environnement.objets.Cercle;
import environnement.objets.IObjet;
import environnement.objets.Rectangle;
import genetique.Evolution;
import graphique.Graphique;
import reseau.ReseauNeuronal;

import robot.IRobot;
import robot.RobotCentre;
import robot.RobotCourse;


/**
 * Class main
 */
public class main
{

    //
    // Fields
    //
    //
    // Constructors
    //
    public main()
    {
    };

    //
    // Methods
    //
    /**
     */
    public static void run()
    {
    }

    /**
     * Initialisation et création des objets
     */
    public static void initialise()
    {
    }

    public static void main(String[] args) throws InterruptedException
    {
    	// Numero de l'iteration
    	int iteration = 0;
    	
        // Initialisation et déclaration
        // Liste des obstacle
        ArrayList<IObjet> listeObj = new ArrayList<IObjet>();

        // Liste des robots appartenant a un groupe
        ArrayList<IRobot> groupe = new ArrayList<IRobot>();

        // Liste des groupes des robots
        ArrayList<ArrayList<IRobot>> listesBot = new ArrayList<ArrayList<IRobot>>();

        // Environnement
        Environnement env = Environnement.getInstance();

        // Initialisation des robots
        IRobot robot1 = new RobotCentre(100, 1, 0);
        IRobot robot2 = new RobotCentre(180, 2, 0);
        IRobot robot3 = new RobotCentre(3, 180, 0);
        IRobot robot4 = new RobotCentre(79, 20, 0);
        IRobot robot5 = new RobotCentre(90, 87, 0);
        IRobot robot6 = new RobotCentre(300, 250, 0);
        IRobot robot7 = new RobotCentre(30, 200, 0);

        IRobot robot8 = new RobotCentre(330, 250, 0);
        IRobot robot9 = new RobotCentre(303, 200, 0);
        // Creation du groupe contenant les 4 robots définient au dessus
        groupe.add(robot1);
        groupe.add(robot2);
        groupe.add(robot3);
        groupe.add(robot4);
        groupe.add(robot5);
        groupe.add(robot6);
        groupe.add(robot7);
        groupe.add(robot8);
        groupe.add(robot9);


        // Ajout du groupe dans la liste des groupes
        listesBot.add(groupe);

        // Initilalisation des objets
        IObjet rectangle = new Rectangle(30, 30, 30, 30, Color.CYAN.getRGB(), Color.BLACK.getRGB());
        IObjet cercle = new Cercle(230, 140, 20, Color.CYAN.getRGB(), Color.BLACK.getRGB());
        IObjet cercle1 = new Cercle(env.getLargeur()/2, env.getLongueur()/2, 3, Color.RED.getRGB(), Color.RED.getRGB());

        // Ajout des objets dans la liste
        listeObj.add(rectangle);
        listeObj.add(cercle);
        listeObj.add(cercle1);

        // Initialisation de l'environnement
        env.setListe_objets(listeObj);
        env.setListes_Robots(listesBot);

        // Creation de la fenetre en fonction de l'environnement
        JFrame jf = Graphique.drawEnv();


         // Configuration du réseau de neurone
        int iNbEntree = 2;
        int iNbSortie = 2;
        int iNbCoucheCachee = 1;
        int iNbNeuronneCoucheCache = 10;
        ReseauNeuronal reseau = new ReseauNeuronal(iNbEntree, iNbSortie, iNbCoucheCachee, iNbNeuronneCoucheCache);

        // Lancement de la simulation
        while (true)
        {
            Thread.sleep(50);
            
            System.out.println( "Iteration : " + iteration ++ ) ;
            System.out.println( "\n\n" ) ;            
            
            env.dessiner((Graphics2D) (jf.getGraphics()));


            for (int i = 0; i < env.getListes_Robots().size(); ++i)
            {
                for (int j = 0; j < env.getListes_Robots().get(i).size(); ++j)
                {
                    env.getListes_Robots().get(i).get(j).updateCapteurs(env.getListes_Robots().get(i).get(j));
                }
            }

            for (int i = 0; i < env.getListes_Robots().size(); ++i)
            {
                for (int j = 0; j < env.getListes_Robots().get(i).size(); ++j)
                {
                	System.out.print( "Robot : " + j + "\t" );
                    env.getListes_Robots().get(i).get(j).executeActions(env.getListes_Robots().get(i).get(j));
                }
                System.out.println( "\n" );
            }

            for (int i = 0; i < env.getListes_Robots().size(); ++i)
            {
                for (int j = 0; j < env.getListes_Robots().get(i).size(); ++j)
                {
                    env.getListes_Robots().get(i).get(j).updateInfos(env.getListes_Robots().get(i).get(j));
                }
            }
            
            for (int i = 0; i < env.getListes_Robots().size(); ++i)
            {
                for (int j = 0; j < env.getListes_Robots().get(i).size(); ++j)
                {
                	System.out.print( "Robot : " + j + "\t" );
                    reseau.calcul(env.getListes_Robots().get(i).get(j).getMatricePoids(),
                            env.getListes_Robots().get(i).get(j).getListeCapteurs(),
                            env.getListes_Robots().get(i).get(j).getListe_Sorties(),
                            env.getListes_Robots().get(i).get(j).getValeursNeurones());
                    
                    System.out.println( "\tScore : " + env.getListes_Robots().get(i).get(j).calculScore() );
                    
                }
                // Passage à la régération suivante
                Evolution.reproduction( env.getListes_Robots().get(i) );
                System.out.println( "\n" );
            }


        }
        // gr.dessiner( env ) ;

    }
}
